package cc.rengu.igas.bomp.common.util;

import cc.rengu.igas.bomp.common.constant.TableNameConstant;
import cc.rengu.igas.bomp.common.enums.AuditStatusEnum;
import cc.rengu.igas.bomp.facade.enums.BompAuditFlagEnum;
import cc.rengu.igas.bomp.facade.enums.BompAuditOprTypeEnum;
import cc.rengu.oltp.utility.util.StringUtil;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;

/**
 * @author: zhangxuran
 * @Date: 2020/3/30 15:11
 * @Description: 状态转换
 */
public class ChangeNextStatusUtil {

    private static final Table<String, String, String> auditStatusTables = HashBasedTable.create();

    static {
        auditStatusTables.put(AuditStatusEnum.ADD_BE_AUDIT.getAuditStatus(), BompAuditOprTypeEnum.AUDIT_REJECT.getType(), AuditStatusEnum.ADD_AUDIT_REJECT.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.ADD_BE_AUDIT.getAuditStatus(), BompAuditOprTypeEnum.AUDIT_PASS.getType(), AuditStatusEnum.ADD_AUDIT_SUCCESS.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.CANCEL_BE_AUDDIT.getAuditStatus(), BompAuditOprTypeEnum.AUDIT_REJECT.getType(), AuditStatusEnum.CANCEL_AUDIT_REJECT.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.CANCEL_BE_AUDDIT.getAuditStatus(), BompAuditOprTypeEnum.AUDIT_PASS.getType(), AuditStatusEnum.CANCEL_AUDIT_SUCCESS.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.STOP_BE_AUDIT.getAuditStatus(), BompAuditOprTypeEnum.AUDIT_PASS.getType(), AuditStatusEnum.STOP_AUDIT_SUCCESS.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.STOP_BE_AUDIT.getAuditStatus(), BompAuditOprTypeEnum.AUDIT_REJECT.getType(), AuditStatusEnum.STOP_AUDIT_REJECT.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.ENABLE_BE_AUDIT.getAuditStatus(), BompAuditOprTypeEnum.AUDIT_PASS.getType(), AuditStatusEnum.ENABLE_AUDIT_SUCCESS.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.ENABLE_BE_AUDIT.getAuditStatus(), BompAuditOprTypeEnum.AUDIT_REJECT.getType(), AuditStatusEnum.ENALBLE_AUDIT_REJECT.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.MODIFY_BE_AUDIT.getAuditStatus(), BompAuditOprTypeEnum.AUDIT_PASS.getType(), AuditStatusEnum.MODIFY_AUDIT_SUCCESS.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.MODIFY_BE_AUDIT.getAuditStatus(), BompAuditOprTypeEnum.AUDIT_REJECT.getType(), AuditStatusEnum.MODIFY_AUDIT_REJECT.getAuditStatus());

        //无需审核 -》 审核通过  (新增待审核由 商户产品管理统一修改为审核通过)
        //无需审核 -》 审核通过  (待提交审批由 商户产品管理统一修改为新增待审核)
        auditStatusTables.put(AuditStatusEnum.CANCEL_BE_AUDDIT.getAuditStatus(), BompAuditFlagEnum.NO_CHECK.getType(), AuditStatusEnum.CANCEL_AUDIT_SUCCESS.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.STOP_BE_AUDIT.getAuditStatus(), BompAuditFlagEnum.NO_CHECK.getType(), AuditStatusEnum.STOP_AUDIT_SUCCESS.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.ENABLE_BE_AUDIT.getAuditStatus(), BompAuditFlagEnum.NO_CHECK.getType(), AuditStatusEnum.ENABLE_AUDIT_SUCCESS.getAuditStatus());
        auditStatusTables.put(AuditStatusEnum.MODIFY_BE_AUDIT.getAuditStatus(), BompAuditFlagEnum.NO_CHECK.getType(), AuditStatusEnum.MODIFY_AUDIT_SUCCESS.getAuditStatus());
    }


    public static String getNextAuditStatus(String currentStatus, String auditType) {
        return auditStatusTables.get(currentStatus, auditType);
    }


    /**
     * 校验是否允许修改状态
     *
     * @param currentStatus 当前状态
     * @return 是否允许修改
     */
    public static boolean isAllowModifyData(String currentStatus) {
        if (StringUtil.isEmptyOrNull(currentStatus)) {
            return false;
        }

        //注： 00-待提交审批，03-新增审核拒绝  允许修改
        //当前状态为新增待审核，修改待审批，停用待审批，注销待审批，启用待审核 不允许进行修改
        return !AuditStatusEnum.ADD_BE_AUDIT.getAuditStatus().equals(currentStatus)
                && !AuditStatusEnum.MODIFY_BE_AUDIT.getAuditStatus().equals(currentStatus)
                && !AuditStatusEnum.STOP_BE_AUDIT.getAuditStatus().equals(currentStatus)
                && !AuditStatusEnum.CANCEL_BE_AUDDIT.getAuditStatus().equals(currentStatus)
                && !AuditStatusEnum.ENABLE_BE_AUDIT.getAuditStatus().equals(currentStatus);
    }


    /**
     * 校验是否允许修改状态
     *
     * @param currentStatus 当前状态
     * @return 是否允许修改
     */
    public static boolean isAllowAuditData(String currentStatus) {
        if (StringUtil.isEmptyOrNull(currentStatus)) {
            return false;
        }

        //注： 00-待提交审批，03-新增审核拒绝  允许修改
//        //当前状态为新增待审核，修改待审批，停用待审批，注销待审批，启用待审核 不允许进行修改
//        return !AuditStatusEnum.ADD_BE_AUDIT.getAuditStatus().equals(currentStatus)
//                && !AuditStatusEnum.CANCEL_BE_AUDDIT.getAuditStatus().equals(currentStatus)
//                && !AuditStatusEnum.STOP_BE_AUDIT.getAuditStatus().equals(currentStatus)
//                && !AuditStatusEnum.MODIFY_BE_AUDIT.getAuditStatus().equals(currentStatus)
//                && !AuditStatusEnum.ENABLE_BE_AUDIT.getAuditStatus().equals(currentStatus);
        if (AuditStatusEnum.ADD_BE_AUDIT.getAuditStatus().equals(currentStatus) ||
                AuditStatusEnum.CANCEL_BE_AUDDIT.getAuditStatus().equals(currentStatus) ||
                AuditStatusEnum.STOP_BE_AUDIT.getAuditStatus().equals(currentStatus) ||
                AuditStatusEnum.MODIFY_BE_AUDIT.getAuditStatus().equals(currentStatus) ||
                AuditStatusEnum.ENABLE_BE_AUDIT.getAuditStatus().equals(currentStatus)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 校验是否允许修改状态
     *
     * @param currentStatus 当前状态
     * @param tableName     表
     * @return 是否允许修改
     */
    public static boolean isAllowModifyDataByAuditAndTable(String currentStatus, String tableName) {
        if (StringUtil.isEmptyOrNull(currentStatus)) {
            return true;
        }

        //注： 00-待提交审批，03-新增审核拒绝  允许修改
        //当前状态为新增待审核，修改待审批，停用待审批，注销待审批，启用待审核 不允许进行修改
        if (AuditStatusEnum.ADD_BE_AUDIT.getAuditStatus().equals(currentStatus)
                || AuditStatusEnum.MODIFY_BE_AUDIT.getAuditStatus().equals(currentStatus)
                || AuditStatusEnum.STOP_BE_AUDIT.getAuditStatus().equals(currentStatus)
                || AuditStatusEnum.CANCEL_BE_AUDDIT.getAuditStatus().equals(currentStatus)
                || AuditStatusEnum.ENABLE_BE_AUDIT.getAuditStatus().equals(currentStatus)) {

            //当表为 基础信息表，签约信息表，映像信息表，结算信息表，产品信息表，费率信息表，分期信息表，权限信息表，微信信息表，阿里信息表，银联信息表  不允许修改
            return TableNameConstant.T_B_MCHNT_BASE_INFO.equals(tableName)
                    || TableNameConstant.T_B_MCHNT_SIGN_INFO.equals(tableName)
                    || TableNameConstant.T_B_MCHNT_IMAGE_INFO.equals(tableName)
                    || TableNameConstant.T_B_MCHNT_ACCT_INFO.equals(tableName)
                    || TableNameConstant.T_B_MCHNT_PROD_INFO.equals(tableName)
                    || TableNameConstant.T_B_MCHNT_FEE_INFO.equals(tableName)
                    || TableNameConstant.T_B_MCHNT_STAGE_INFO.equals(tableName)
                    || TableNameConstant.T_B_MCHNT_AUTH_CTRL.equals(tableName)
                    || TableNameConstant.T_B_WECHAT_MCHNT_INFO.equals(tableName)
                    || TableNameConstant.T_B_ALPAY_MCHNT_INFO.equals(tableName)
                    || TableNameConstant.T_B_CUPS_MCHNT_INFO.equals(tableName);
        }

        return false;
    }
}
